package com.njtoyo.taxi.admin.library.common.util;

import org.springframework.util.ObjectUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;

public class TimeUtil {

    /**
     * 判断时间是否重叠
     * -1  "开始时间晚于结束时间"
     * -2  "前后时间重叠"
     * -3  "有重叠"
     * -4  判断时间长期有效是否有多个
     * -5  判断其他时间段的结束时间是否在长期有效时间的开始之前
     *
     * @param list
     * @throws ParseException
     */
    public static int timeOverlap(List<String> list) {
        //先把所有时间进行排序,开始时间早的在前
        Collections.sort(list);
        SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
        //startFlag 标记长期有效的开始时间
        Date startFlag = null;
        //标记一下最晚的结束时间,看是否在长期有效的开始时间之前
        Date endFlag = new Date();
        Boolean flag = false;
        try {
            for (int i = 0; i < list.size(); i++) {
                String[] date1 = list.get(i).split("--");
                Date startdate1 = formater.parse(date1[0]);
                String end = date1[1];
                //判断时间长期有效是否有多个
                if (ObjectUtils.isEmpty(end) || ("null").equals(end)) {
                    if (!ObjectUtils.isEmpty(startFlag)) {
                        throw new RuntimeException("存在多个长期有效的时间段重叠");
                    }
                    startFlag = startdate1;
                    /**
                     * 针对于长期有效的时间做判断
                     * 判断其他时间是否晚于长期有效时间的开始时间
                     */
                    if (!ObjectUtils.isEmpty(startFlag)) {
                        if (startdate1.after(startFlag)) {
                            flag = true;
                        }
                        if (flag) {
                            throw new RuntimeException("时间段与长期有效的时间段重叠");
                        }
                    }
                }
                //判断其他时间段的结束时间是否在长期有效时间的开始之前
                if (("null").equals(end) && list.size() != 1) {
                    if (endFlag.compareTo(startFlag) == 0
                            || endFlag.after(startFlag)) {
                        throw new RuntimeException("时间段与长期有效的时间段重叠");
                    }
                    continue;
                }
                if (("null").equals(end) && list.size() == 1) {
                    continue;
                }
                //获取到不为空的结束时间
                Date enddate1 = formater.parse(date1[1]);
                //验证开始时间和结束时间是否相同
                if (enddate1.compareTo(startdate1) == 0) {
                    throw new RuntimeException("前后时间段有相同时间");
                }
                //当前时间段和其他的所有时间段进行比较
                for (int j = i + 1; j < list.size(); j++) {
                    String[] date2 = list.get(j).split("--");
                    Date startdate2 = formater.parse(date2[0]);
                    //TODO null的话正常,此处为了防止前端传""导致的数组越界
                    int length = date2.length;
                    if (length == 1) {
                        break;
                    }
                    //对后面的空值进行判断
                    String s = date2[1];
                    if (ObjectUtils.isEmpty(s) || s.equals("null")) {
                        continue;
                    }
                    Date enddate2 = formater.parse(date2[1]);
                    if (startdate1.after(enddate1) || startdate2.after(enddate2)) {
                        throw new RuntimeException("开始时间晚于结束时间");
                    }
                    if (startdate1.compareTo(startdate2) == 0 || enddate1.compareTo(enddate2) == 0 || enddate1.compareTo(startdate2) == 0) {
                        throw new RuntimeException("前后时间段有相同时间");
                    }
                    if (startdate1.before(startdate2) && enddate1.after(startdate2)) {
                        throw new RuntimeException("时间段有重叠部分");
                    }
                }
                endFlag = enddate1;
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 1;
    }
}
